package JUC.第02章_Future;

import java.util.concurrent.*;

public class D5_CompletableFuture线程池的选择 {
    public static void main(String[] args) {

        System.out.println("--------默认是ForkJoinPool 线程池--------------------------------------");
        CompletableFuture.runAsync(() -> {
            //默认是ForkJoinPool 线程池
            System.out.println(Thread.currentThread().getName());
        }).join(); //相当与接着执行新的任务  没返回值

        System.out.println("--------使用指定线程池--------------------------------------");
        ExecutorService executorService = Executors.newFixedThreadPool(5);//固定线程

        CompletableFuture<Integer> integerCompletableFuture =
                CompletableFuture.supplyAsync(() -> {
                    int result = ThreadLocalRandom.current().nextInt(10);//随机获取[0-9]
                    //如果主任务 执行太快，可能会直接使用 main 线程执行
                    try { TimeUnit.MILLISECONDS.sleep(1000); } catch (Exception e) { e.printStackTrace(); }
                    return result;
                }, executorService);
        /**
         * thenRun()       使用的是自定义的线程池
         * 如果主任务(supplyAsync()的任务)执行太快，可能会直接使用 main 线程执行
         *
         * thenRunAsync()  使用的是默认的线程池   ForkJoinPool   除非 在()里指定线程池
         * Async//异步的
         *
         * //下面的  同理
         * thenAccept()  thenAcceptAsync()
         * thenApply()   thenApplyAsync()
         */
        integerCompletableFuture.thenRun(() -> { // thenRun  继承上一个线程池
            System.out.println(Thread.currentThread().getName() + "我是thenRun001");
        }).thenRun(() -> {
            System.out.println(Thread.currentThread().getName() + "我是thenRun002");
        }).thenRun(() -> {
            System.out.println(Thread.currentThread().getName() + "我是thenRun003");
        }).thenRun(() -> {
            System.out.println(Thread.currentThread().getName() + "我是thenRun004");
        }).thenRunAsync(() -> {// thenRunAsync  不继承上一个线程池
            System.out.println(Thread.currentThread().getName() + "我是thenRunAsync");
        }).join();

        Integer join = integerCompletableFuture.join();
        System.out.println("随机数是：" + join);
        executorService.shutdown();
    }
}
